package com.quanxiaoha.xiaohashu.note.biz.config;


import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

import java.util.concurrent.Executor;
import java.util.concurrent.ThreadPoolExecutor;

/**
 * @Author: jingyan_liu
 * @CreateTime: 2025-07-09
 * @Description: 通过 Spring 配置类创建了一个线程池执行器 Bean，对线程池的核心线程数、最大线程数、队列容量、线程存活时间等参数进行了配置，
 * 并设置了拒绝策略和线程池关闭行为，方便在 Spring 应用中进行异步任务处理。可以在其他地方通过 @Autowired 注解注入这个线程池执行器 Bean，
 * @Version: 1.0
 */

//配置类，Spring 会扫描并处理这个类中的 @Bean 注解方法，将其返回的对象注册到 Spring 应用上下文中
@Configuration
public class ThreadPoolConfig {
	
	@Bean
	public Executor taskExecutor() {
		ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
		// 核心线程数
		executor.setCorePoolSize(10);
		// 最大线程数
		executor.setMaxPoolSize(50);
		// 队列容量
		executor.setQueueCapacity(200);
		// 线程活跃时间（秒）
		executor.setKeepAliveSeconds(30);
		// 线程名前缀
		executor.setThreadNamePrefix("NoteExecutor-");
		
		// 拒绝策略：由调用线程处理（一般为主线程）
		executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
		
		// 等待所有任务结束后再关闭线程池
		executor.setWaitForTasksToCompleteOnShutdown(true);
		// 设置等待时间，如果超过这个时间还没有销毁就强制销毁，以确保应用最后能够被关闭，而不是被没有完成的任务阻塞
		executor.setAwaitTerminationSeconds(60);
		
		executor.initialize();
		return executor;
	}
}
